home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE SFP004;⓪ (*$Y+, L-, N+, M-*)⓪ ⓪ (*⓪"25.10.90 TT Format Error wird erkannt⓪"17.12.90 TT FPUReset setzt FPU auch nach Fehler wieder richtig zurück⓪"20.02.91 TT FPUError: LINK für Scanning eingesetzt⓪"16.01.94 TT FPUInit ruft nicht mehr SysInfo.FPU() auf sondern prüft direkt⓪0auf Vorhandensein der FPU.⓪"08.02.94 TT Kein Byte-Zugriff mehr auf fpstat+1.⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER;⓪ FROM SystemError IMPORT Abort;⓪ FROM MOSSupport IMPORT ToSuper, ToUser;⓪ IMPORT MOSGlobals;⓪ ⓪ CONST fpstat = $fffa40; (* Response word of MC68881 read *)⓪&fpctrl = $fffa42; (* Control word of MC68881 write *)⓪&fpsave = $fffa44;⓪&fpcmd = $fffa4a; (* Command word of MC68881 write *)⓪&fpop = $fffa50; (* Operand long of MC68881 read/write *)⓪ ⓪ PROCEDURE FPUReset;⓪"BEGIN⓪$ASSEMBLER⓪(TST.W fpstat⓪(MOVE.W #3,fpctrl ; Reset FPU⓪(CMPI.W #$0802,fpstat⓪(BEQ idle⓪(; die FSAVE-Anforderung muß erst beendet werden:⓪&again:⓪(MOVE.W fpstat,D0⓪(TST.B D0⓪(BNE endRead⓪(TST.L fpop⓪(BRA again⓪&endRead:⓪(MOVE.W #3,fpctrl ; Reset FPU⓪&idle:⓪(; FMOVE #$0000F400,FPCR⓪(; Bedeutung der Bits: Take Exception on...⓪(; - Operand Error⓪(; - Overflow⓪(; - Div By Zero⓪(; - NAN⓪(; - Bcc/Scc on unordered⓪(TST.W fpstat⓪(MOVE.W #$9000,fpcmd⓪%RL MOVE.W fpstat,D0⓪(TST.B D0⓪(BEQ RL⓪(MOVE.L #$0000F400,fpop⓪(TST.W fpstat⓪$END⓪"END FPUReset;⓪ ⓪ PROCEDURE FPUError;⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE fpstat,-(A7)⓪(MOVE fpsave,-(A7)⓪(JSR FPUReset⓪(MOVE (A7)+,D1⓪(MOVE (A7)+,D0⓪ ⓪(ANDI #$FF00,D1⓪(CMPI #$0200,D1⓪(BNE noFormatError⓪(⓪(TRAP #6⓪(DC.W -22-$E000 ; Gen. FP error: Text follows, callerCaused, noCont⓪(ACZ 'Format Error (FSAVE/FRESTORE)'⓪(SYNC⓪(UNLK A5⓪(RTS⓪(⓪ noFormatError:⓪(CMPI.B #$0D,D0⓪(BNE no0D⓪(TRAP #6⓪(DC.W -22-$C000 ; Gen. FP error: Text follows, callerCaused, mayCont⓪(ACZ 'FPU Protocol Violation'⓪(SYNC⓪(UNLK A5⓪(RTS⓪&no0D⓪(CMPI.B #$32,D0⓪(BNE no32⓪(TRAP #6⓪(DC.W -5-$4000 ; div by zero: callerCaused, mayCont⓪(UNLK A5⓪(RTS⓪&no32⓪(CMPI.B #$34,D0⓪(BNE no34⓪(TRAP #6⓪(DC.W -6-$4000 ; out of range (operand error): callerCaused, mayCont⓪(UNLK A5⓪(RTS⓪&no34⓪(CMPI.B #$35,D0⓪(BNE no35⓪(TRAP #6⓪(DC.W -7-$4000 ; Overflow: callerCaused, mayCont⓪(UNLK A5⓪(RTS⓪&no35⓪(TRAP #6⓪(DC.W -22-$4000 ; Gen. FP error: callerCaused, mayCont⓪(UNLK A5⓪$END⓪"END FPUError;⓪ ⓪ (*$Z+*)⓪ PROCEDURE hasSFP (): BOOLEAN;⓪ (*$Z=*)⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L #4,A7⓪(JSR ToSuper⓪ ⓪(MOVEQ #FALSE,D0⓪(MOVE.L A7,D2⓪(MOVE.L $08,D1 ; BusError-Exc-Vektor⓪(LEA b(PC),A0⓪(MOVE.L A0,$08⓪(TST.W fpstat⓪(MOVEQ #TRUE,D0⓪&b MOVE.L D2,A7⓪(MOVE.L D1,$08⓪ ⓪(JSR ToUser⓪(ADDQ.L #4,A7⓪$END⓪"END hasSFP;⓪ ⓪ PROCEDURE FPUInit;⓪"BEGIN⓪$(* 16.1.94:⓪%* Es wird nur direkt auf die SFP004 geprüft, weil SysInfo.FPU() beim⓪%* Vorhandensein einer internalFPU gar nicht mehr auf die externe prüft.⓪%* So liefert FPU() dann "internalFPU", obwohl auch die gesuchte⓪%* SFP004 installiert wäre.⓪%*)⓪$IF NOT hasSFP () (* vormals: FPU () # externalFPU *) THEN⓪&ASSEMBLER⓪(MOVE.W #MOSGlobals.fUnknownDevice,(A3)+⓪(JMP Abort⓪&END⓪$END;⓪$FPUReset⓪"END FPUInit;⓪ ⓪ END SFP004.⓪ ə
- (* $FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$00000755$FFE39FCE$00000D6F$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCEÇ$00000157T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00000165$00000157$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCE$FFE39FCEêÇé*)
-